package features.advance.leetcode.interview.alibaba;

import com.alibaba.fastjson.JSONObject;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author LIN
 * @date 2021-08-16
 */
public class MainA {

    public static void main(String[] args) {
        String[][] strs = {{"中国"},{"中国","浙江"},{"中国","浙江","杭州"},{"中国","浙江","杭州","余杭区"},{"中国","浙江","宁波"},{"中国","广东"}};
        Solution solution = new Solution();
        Map<String, Object> map = solution.parse(strs);
        System.out.println(JSONObject.toJSONString(map));



    }

    /**
     * A:
     * 1、序列化有层级关系的数据现在有一串数据中国中国浙江,
     * 中国浙江杭州中国浙江杭州余杭区中国浙江宁波中国广东…请你做到解析这些数据之后返回树形结构的json字符串。
     * 并且在层级增加之后数据复杂之后也可以适配。如下图所示：
     *{
     *     "中国": {
     *         "浙江": {
     *             "杭州": {
     *                 "余杭区": {}
     *             },
     *             "宁波": {}
     *         },
     *         "广东": {}
     *     }
     * }
     *
     */
    static class Solution {
        /**
         * 用map来构造层级结构
         * @param strs
         * @return
         */
        public Map<String,Object> parse(String[][] strs){
            Map<String,Object> map = new LinkedHashMap<>(16);
            Map<String,Object> tmp = map;

            for (int i = 0; i < strs.length; i++) {
                String[] str = strs[i];
                for (int j = 0; j < str.length; j++) {
                    // 获取每一层级的值
                    String s = str[j];
                    // 如果当前层级的map包含这个值，就将当前map替换成这个值对应的map
                    if(tmp.containsKey(s)){
                        Object o = tmp.get(s);
                        if(o.getClass().equals(String.class)){
                            // 数据复杂后，可能出现字符串或者其他类型
                        }else if(o.getClass().equals(LinkedHashMap.class)){
                            tmp = (LinkedHashMap<String,Object>)o;
                        }
                    }else {
                        // 不包括s，就放一个空map进去
                        Map<String, Object> map1 = new LinkedHashMap<>(16);
                        tmp.put(s,map1);
                        // 将空map赋值给缓存map，层级移动到下一层
                        tmp = map1;
                    }
                }
                // 缓存map重新指向总map
                tmp = map;
            }
            return map;
        }
    }
}
